先來看一個簡單的範例:
var a int = 10
b := a
b = 20
fmt.Println(a) // 10
fmt.Println(b) // 20
在這個範例中,我們首先宣告並初始化一個變數 a
,其值為 10。接著初始化另一個變數 b
,並將 a
的值賦給 b
。然後將 b
的值更改為 20。最後印出 a
和 b
的值,分別為 10 和 20。
那如果我們將 a
的指標賦給 b
,然後將 b
的值更改為 20 ,會得到怎樣的結果?
var a int = 10
b := &a
*b = 20 // 要使用 * 才能改到指摽的值
fmt.Println(a) // 20
fmt.Println(*b) // 20
在這個範例中,我們將 a
的指標賦值給 b
,然後使用 *b
的方式來更改 a
的值。因為 b
存儲的是 a
的記憶體地址,所以當我們通過 *b
修改該地址上的值時,a
的值也會被修改。最後印出 a
和 *b
的值,結果均為 20。
type Person struct {
Name string
Age int
}
person := &Person{
Name: "John",
Age: 30,
}
person.Name = "Doe"
person.Age = 40
fmt.Println(person.Name) // Doe
fmt.Println(person.Age) // 40
type Person struct {
Name string
Age int
}
people := make([]*Person, 0)
person := &Person{
Name: "John",
Age: 30,
}
people = append(people, person)
fmt.Println(people[0]) // &{John 30}
type Person struct {
Name string
Age int
}
peopleMap := make(map[string]*Person)
peopleMap["person_a"] = &Person{
Name: "John",
Age: 30,
}
peopleMap["person_b"] = &Person{
Name: "Jane",
Age: 20,
}
fmt.Println(peopleMap) // map[1:0xc00012a000 2:0xc00012a018]
以上為 struct、slice 和 map 與指標搭配時,最常使用的開發情境。
先來看 ChatGPT 的答案
在以下情況下,你應該考慮使用指標:
以我目前的實務經驗,大部分的情況都是使用指標,這要注意的是使用指標可能會影響到原始資料,所以操作時要格外注意。不使用指標其實也是可以的,但缺點就如上述所說可能會造成記憶體浪費。
這沒有一定的答案,以依照開發需求或團隊風格為主。